package com.xz;

import java.util.function.Function;
import java.util.function.IntBinaryOperator;
import java.util.function.IntConsumer;
import java.util.function.IntPredicate;

/**
 * @Author：xz
 * @Date：2023/3/28
 */
public class LambdaDemo01 {
    public static void main(String[] args) {
        // 例一
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("新线程中的run方法被执行了！");
//            }
//        }).start();
//
//        new Thread(() -> System.out.println("lambda:新线程中的run方法被执行了！")).start();

        // 例二：写完匿名内部类，如果能简化成labmda表达式，可以直接按 alt + 回车
//        int i = calculateNum(new IntBinaryOperator() {
//            @Override
//            public int applyAsInt(int left, int right) {
//                return left + right;
//            }
//        });
//        int i = calculateNum((int left, int right) -> {
//            return left + right;
//        });
//        System.out.println(i);
        // 例三
//        printNum(new IntPredicate() {
//            @Override
//            public boolean test(int value) {
//                return value % 2 == 0;
//            }
//        });
        // 例四
//        Integer integer = typeConver((String s) -> {
//            return Integer.valueOf(s);
//        });
//        System.out.println(integer);
//
//        String string = typeConver((String s) -> {
//            return s + "xz";
//        });
//        System.out.println(string);
        // 例五
//        foreachArr(value -> System.out.println(value));
        printNum2(value -> value % 2 == 0, value -> value > 4);
    }

    public static void printNum2(IntPredicate predicate,IntPredicate predicate2) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        for (int i : arr) {
            if (predicate.and(predicate2).test(i)) {
                System.out.println(i);
            }
        }
    }

    // 例二
    public static int calculateNum(IntBinaryOperator operator) {
        int a = 10;
        int b = 20;
        return operator.applyAsInt(a, b);
    }

    // 例三
    public static void printNum(IntPredicate predicate) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        for (int i : arr) {
            if (predicate.test(i)) {
                System.out.println(i);
            }
        }
    }

    // 例四
    public static <R> R typeConver(Function<String, R> function) {
        String str = "1235";
        R result = function.apply(str);
        return result;
    }

    // 例五
    public static void foreachArr(IntConsumer consumer) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        for (int i : arr) {
            consumer.accept(i);
        }
    }
}
